package day20170505.homework.ch01;

/**
 * 实现IStudentLink的业务类
 * @author 罗智壕-13424431416
 *
 * 2017年5月5日
 */
public class IStudentLinkImpl implements IStudentLink {
	
	/**
	 * 链表的头部
	 */
	private Node head;
	
	/**
	 * 链表的构造方法
	 * @param head
	 */
	public IStudentLinkImpl(Node head) {
		this.head = head;
	}

	/**
	 * 添加1个学生到链表的末尾
	 * @param student
	 */
	@Override
	public void addStudent(Node addStudent) {
		//获取头部节点
		Node temp = this.head;
		
		//第一次增加不用进行判断，直接加入
		if(null == temp.getNext()){
			temp.setNext(addStudent);
			return;
		}
		
		while(true){
			//如果当前节点为空，
			if(null == temp.getNext()){
				//直接加入学生对象
				temp.setNext(addStudent);
				return;
			}
			//下个节点赋值给当前节点
			temp = temp.getNext();
		}
	}
	
	/**
	 * 在参照物学生parentStudent的后面添加1个学生insertsSudent
	 * @param parentStudent
	 * @param student
	 */
	@Override
	public void insertStudent(Node parentStudent, Node insertsSudent) {
		//获取头部节点
		Node temp = this.head.getNext();
		while(true){
			//需要增加到后面的名字
			String name = parentStudent.getData().getName();
			//获取当前节点的名字
			String dataName = temp.getData().getName();
			if(name.equals(dataName)){
				insertsSudent.setNext(temp.getNext());
				temp.setNext(insertsSudent);
				break;
			}
			temp = temp.getNext();
		}
	}
	
	/**
	 * 打印所有的学生
	 */
	@Override
	public void printStudent() {
		//获取头部节点的下一个节点
		Node temp = this.head.getNext();
		while(true){
			System.out.println(temp.getData().toString());
			//如果是空，代表遍历到了末尾
			if(null == temp.getNext()){
				return;
			}
			//下个节点赋值给当前节点
			temp = temp.getNext();
		}
	}
	
	/**
	 * 打印所有的女生
	 */
	@Override
	public void printGirls() {
		//获取头部节点的下一个节点
		Node temp = this.head.getNext();
		while(true){
			//获取到当前节点的数据域中的性别
			char sex = temp.getData().getSex();
			//进行判断，如果是女的就打印
			if(sex == '女'){
				System.out.println(temp.getData().toString());
			}
			//如果是空，代表遍历到了末尾
			if(null == temp.getNext()){
				return;
			}
			//下个节点赋值给当前节点
			temp = temp.getNext();
		}
	}
	
	/**
	 * 删除指定的学生
	 * @param student
	 */
	@Override
	public void deleteStudent(Student student) {
		//获取删除对象中的名字
		String name = student.getName();
		if(null == name){
			System.out.println("删除的名字不能为空...");
			return;
		}
		//获取头部节点中的下一个节点
		Node temp = this.head;
		while(true){
			if(null != temp.getNext()){
				//获取当前节点中下一个节点的数据域的名字
				String dataName = temp.getNext().getData().getName();
				//判断名字是否相同
				if(name.equals(dataName)){
					//如果相同，当前的节点中的下下个节点（当前节点的下一个节点就是要删除的）赋值给当前节点的next
					temp.setNext(temp.getNext().getNext());
					break;
				}
			}
			//当前节点的下一个节点赋值给当前节点
			temp = temp.getNext();
		}
	}
	
	/**
	 * 把制定的姓名的学生的年龄修改为age
	 * @param studentName
	 * @param age
	 */
	@Override
	public void updateStudent(String studentName, int age) {
		
		//修改的名字不能等于空
		if(studentName == null){
			System.out.println("修改学生的名字不能为空...");
			return;
		}
		
		//获取头部节点的下一个节点
		Node temp = this.head.getNext();
		while(true){
			//获取当前节点中数据域中的名字
			String name = temp.getData().getName();
			//判断名字是否相同
			if(studentName.equals(name)){
				//年龄进行修改
				temp.getData().setAge(age);
			}
			//如果当前节点中的next等于null，代表到了尾部
			if(null == temp.getNext()){
				return;
			}
			//获取到当前节点中的下一个节点
			temp = temp.getNext();
		}
	}
}
